import { useAppStore } from '@/store/app';
import axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig } from 'axios';
import { ElMessage } from 'element-plus';
import router from '@/router/index';
// 定义接口返回的数据结构
interface ApiResponse<T = any> {
    code: number;
    message: string;
    data: T;
}

// 创建 Axios 实例
const http: AxiosInstance = axios.create({
    baseURL: import.meta.env.VITE_API_BASE_URL,
    timeout: 10000,
    headers: {
        'Content-Type': 'application/json',
    },
});



// 请求拦截器
http.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        // 在发送请求之前做些什么
        const appStore = useAppStore()
        // 如果有 token，添加到请求头
        const token = appStore.getToken
        if (token) {
            config.headers = config.headers || {}
            config.headers.Authorization = `Bearer ${token}`
        }

        // 如果是 GET 请求，添加时间戳防止缓存
        if (config.method?.toUpperCase() === 'GET') {
            config.params = {
                ...config.params,
            }
        }

        return config
    },
    (error: AxiosError) => {
        // 对请求错误做些什么
        return Promise.reject(error)
    }
)
// 响应拦截器
http.interceptors.response.use(
    (response:any) => {
        // 对响应数据做点什么
        // 根据业务状态码处理不同情况
        if (response.status === 200) {
            return response.data // 直接返回业务数据
        } else if (response.code === 401) {
            // token 过期处理
            const appStore = useAppStore()
            appStore.setToken('')
            router.push('/login')
            return Promise.reject(new Error('登录已过期，请重新登录'))
        } else {
            // 其他错误
            return Promise.reject(new Error(response.message || 'Error'))
        }
    },
    (error: any) => {
        // 对响应错误做点什么
        // HTTP 状态码处理
        if (error.response) {
            switch (error.response.status) {
                case 400:
                    error.message = '请求错误'
                    break
                case 401:
                    error.message = '未授权，请登录'
                       // token 过期处理
                        const appStore = useAppStore()
                        appStore.setToken('')
                        router.push('/login')
                    break
                case 403:
                    error.message = '拒绝访问'
                    break
                case 404:
                    error.message = `请求地址出错: ${error.response.config.url}`
                    break
                case 500:
                    error.message = '服务器内部错误'
                    break
                default:
                    error.message = `连接错误 ${error.response.status}`
            }
        } else if (error.request) {
            error.message = '服务器无响应'
        }
        // 优先使用后端返回的错误信息
        if (error.response?.data) {
            ElMessage.error(error.response.data!.message || error.message)
        }
        return Promise.reject(error)
    }
)

// 封装 GET 请求
export function get<T>(url: string, config?: AxiosRequestConfig): Promise<T> {
    return http.get<ApiResponse<T>>(url, config).then((res) => res.data.data);
}

// 封装 POST 请求
export function post<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return http.post<ApiResponse<T>>(url, data, config).then((res) => res.data.data);
}

// 封装 PUT 请求
export function put<T>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return http.put<ApiResponse<T>>(url, data, config).then((res) => res.data.data);
}

// 封装 DELETE 请求
export function del<T>(url: string, config?: AxiosRequestConfig): Promise<T> {
    return http.delete<ApiResponse<T>>(url, config).then((res) => res.data.data);
}

export default http;